{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 加载图像数据集"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`Linux` `Ascend` `GPU` `CPU` `数据准备` `初级` `中级` `高级`\n",
    "\n",
    "[![](https://gitee.com/mindspore/docs/raw/master/tutorials/training/source_zh_cn/_static/logo_source.png)](https://gitee.com/mindspore/docs/blob/master/tutorials/training/source_zh_cn/use/load_dataset_image.ipynb)&emsp;\n",
    "[![](https://gitee.com/mindspore/docs/raw/master/resource/_static/logo_notebook.png)](https://obs.dualstack.cn-north-4.myhuaweicloud.com/mindspore-website/notebook/master/mindspore_load_dataset_image.ipynb)&emsp;\n",
    "[![](https://gitee.com/mindspore/docs/raw/master/tutorials/training/source_zh_cn/_static/logo_modelarts.png)](https://console.huaweicloud.com/modelarts/?region=cn-north-4#/notebook/loading?share-url-b64=aHR0cHM6Ly9vYnMuZHVhbHN0YWNrLmNuLW5vcnRoLTQubXlodWF3ZWljbG91ZC5jb20vbWluZHNwb3JlLXdlYnNpdGUvbm90ZWJvb2svbW9kZWxhcnRzL21pbmRzcG9yZV9sb2FkX2RhdGFzZXRfaW1hZ2UuaXB5bmI=&image_id=65f636a0-56cf-49df-b941-7d2a07ba8c8c)&emsp;"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 概述"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "在计算机视觉任务中，图像数据往往因为容量限制难以直接全部读入内存。MindSpore提供的`mindspore.dataset`模块可以帮助用户构建数据集对象，分批次地读取图像数据。同时，在各个数据集类中还内置了数据处理和数据增强算子，使得数据在训练过程中能够像经过pipeline管道的水一样源源不断地流向训练系统，提升数据训练效果。\n",
    "\n",
    "此外，MindSpore还支持分布式场景数据加载，用户可以在加载数据集时指定分片数目，具体用法参见[数据并行模式加载数据集](https://www.mindspore.cn/tutorial/training/zh-CN/master/advanced_use/distributed_training_ascend.html#id6)。\n",
    "\n",
    "本教程将以加载MNIST训练数据集[1]为例，演示如何使用MindSpore加载和处理图像数据。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 准备环节"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 导入模块"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "该模块提供API以加载和处理数据集。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import mindspore.dataset as ds"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 下载所需数据集"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "运行以下命令来下载MNIST数据集的训练图像和标签并解压，存放在`./datasets/MNIST_Data`路径中，目录结构如下:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "./datasets/MNIST_Data\n",
      "├── test\n",
      "│   ├── t10k-images-idx3-ubyte\n",
      "│   └── t10k-labels-idx1-ubyte\n",
      "└── train\n",
      "    ├── train-images-idx3-ubyte\n",
      "    └── train-labels-idx1-ubyte\n",
      "\n",
      "2 directories, 4 files\n"
     ]
    }
   ],
   "source": [
    "!mkdir -p ./datasets/MNIST_Data/train ./datasets/MNIST_Data/test\n",
    "!wget -NP ./datasets/MNIST_Data/train https://mindspore-website.obs.myhuaweicloud.com/notebook/datasets/mnist/train-labels-idx1-ubyte \n",
    "!wget -NP ./datasets/MNIST_Data/train https://mindspore-website.obs.myhuaweicloud.com/notebook/datasets/mnist/train-images-idx3-ubyte\n",
    "!wget -NP ./datasets/MNIST_Data/test https://mindspore-website.obs.myhuaweicloud.com/notebook/datasets/mnist/t10k-labels-idx1-ubyte\n",
    "!wget -NP ./datasets/MNIST_Data/test https://mindspore-website.obs.myhuaweicloud.com/notebook/datasets/mnist/t10k-images-idx3-ubyte\n",
    "!tree ./datasets/MNIST_Data"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 加载数据集"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "MindSpore目前支持加载图像领域常用的经典数据集和多种数据存储格式下的数据集，用户也可以通过构建自定义数据集类实现自定义方式的数据加载。各种数据集的详细加载方法，可参考编程指南中[数据集加载](https://www.mindspore.cn/doc/programming_guide/zh-CN/master/dataset_loading.html)章节。\n",
    "\n",
    "下面演示使用`mindspore.dataset`模块中的`MnistDataset`类加载MNIST训练数据集。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "1. 配置数据集目录，创建MNIST数据集对象。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "DATA_DIR = './datasets/MNIST_Data/train'\n",
    "mnist_dataset = ds.MnistDataset(DATA_DIR, num_samples=6, shuffle=False)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "2. 创建字典迭代器，通过迭代器获取一条数据，并将数据进行可视化。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "\n",
    "mnist_it = mnist_dataset.create_dict_iterator()\n",
    "data = next(mnist_it)\n",
    "plt.imshow(data['image'].asnumpy().squeeze(), cmap=plt.cm.gray)\n",
    "plt.title(data['label'].asnumpy(), fontsize=20)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "此外，用户还可以在数据集加载时传入`sampler`参数用来指定数据采样方式。MindSpore目前支持的数据采样器及其详细使用方法，可参考编程指南中[采样器](https://www.mindspore.cn/doc/programming_guide/zh-CN/master/sampler.html)章节。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 数据处理"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "MindSpore目前支持的数据处理算子及其详细使用方法，可参考编程指南中[数据处理](https://www.mindspore.cn/doc/programming_guide/zh-CN/master/pipeline.html)章节。\n",
    "\n",
    "下面演示构建pipeline，对MNIST数据集进行`shuffle`、`batch`、`repeat`等操作。\n",
    "\n",
    "操作前的数据如下："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "5\n",
      "0\n",
      "4\n",
      "1\n",
      "9\n",
      "2\n"
     ]
    }
   ],
   "source": [
    "for data in mnist_dataset.create_dict_iterator():\n",
    "    print(data['label'])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "1. 对数据进行混洗。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "after shuffle: \n",
      "4\n",
      "2\n",
      "1\n",
      "0\n",
      "5\n",
      "9\n"
     ]
    }
   ],
   "source": [
    "ds.config.set_seed(58)\n",
    "ds1 = mnist_dataset.shuffle(buffer_size=6)\n",
    "\n",
    "print('after shuffle: ')\n",
    "for data in ds1.create_dict_iterator():\n",
    "    print(data['label'])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "2. 对数据进行分批。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "after batch: \n",
      "[4 2]\n",
      "[1 0]\n",
      "[5 9]\n"
     ]
    }
   ],
   "source": [
    "ds2 = ds1.batch(batch_size=2)\n",
    "\n",
    "print('after batch: ')\n",
    "for data in ds2.create_dict_iterator():\n",
    "    print(data['label'])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "3. 对pipeline操作进行重复。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "after repeat: \n",
      "[4 2]\n",
      "[1 0]\n",
      "[5 9]\n",
      "[2 4]\n",
      "[0 9]\n",
      "[1 5]\n"
     ]
    }
   ],
   "source": [
    "ds3 = ds2.repeat(count=2)\n",
    "\n",
    "print('after repeat: ')\n",
    "for data in ds3.create_dict_iterator():\n",
    "    print(data['label'])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "可以看到，数据集被扩充成两份，且第二份数据的顺序与第一份不同。\n",
    "\n",
    "> 因为`repeat`将对整个数据处理pipeline中已经定义的操作进行重复，而不是单纯将此刻的数据进行复制，故第二份数据执行`shuffle`后与第一份数据顺序不同。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 数据增强"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "MindSpore目前支持的数据增强算子及其详细使用方法，可参考编程指南中[数据增强](https://www.mindspore.cn/doc/programming_guide/zh-CN/master/augmentation.html)章节。\n",
    "\n",
    "下面演示使用`c_transforms`模块对MNIST数据集进行数据增强。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "1. 导入相关模块，重新加载数据集。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "from mindspore.dataset.vision import Inter\n",
    "import mindspore.dataset.vision.c_transforms as transforms\n",
    "\n",
    "mnist_dataset = ds.MnistDataset(DATA_DIR, num_samples=6, shuffle=False)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "2. 定义数据增强算子，对数据集执行`Resize`和`RandomCrop`操作。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "resize_op = transforms.Resize(size=(200,200), interpolation=Inter.LINEAR)\n",
    "crop_op = transforms.RandomCrop(150)\n",
    "transforms_list = [resize_op, crop_op]\n",
    "ds4 = mnist_dataset.map(operations=transforms_list,input_columns='image')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "3. 查看数据增强效果。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "mnist_it = ds4.create_dict_iterator()\n",
    "data = next(mnist_it)\n",
    "plt.imshow(data['image'].asnumpy().squeeze(), cmap=plt.cm.gray)\n",
    "plt.title(data['label'].asnumpy(), fontsize=20)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "可以看到，原始图片经缩放后被随机裁剪至150x150大小。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 参考文献\n",
    "\n",
    "[1] Y. LeCun, L. Bottou, Y. Bengio, and P. Haffner. [Gradient-based learning applied to document recognition](http://yann.lecun.com/exdb/publis/pdf/lecun-98.pdf)."
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python [conda env:mindspore] *",
   "language": "python",
   "name": "conda-env-mindspore-py"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
